// 创建一个守护进程，进程的类型就是Ss

#include <iostream>
#include <cstdio>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <string>

const std::string dev = "/dev/null";

void Daemon()
{
    // 忽略可能会影响守护进程运行的相关信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    // 让父进程直接退出，子进程执行相应代码
    if (fork() > 0)
    {
        exit(0);
    }

    // 让当前子进程成为一个独立的会话
    setsid();

    chdir("/");

    // 守护进程不从stdin输入，也不向stdout、stderr输出
    // Linux中存在一个文件，/dev/null规定写到这里面的文件都被丢弃，读取的内容
    // 都是空
    int fd = ::open(dev.c_str(), O_WRONLY);
    if (fd < 0)
    {
        std::cout << "open fail" << std::endl;
        exit(1);
    }
    else
    {
        // dup2(old fd, new fd), 将oldfd的内容拷贝给前者
        ::dup2(fd, 0);
        ::dup2(fd, 1);
        ::dup2(fd, 2);
        close(fd);
    }
}

int main()
{
    //Daemon();

    //系统调用守护进程化
    //有两个参数，分别是nochdir, noclose,如果第一个为0,那么工作目录将被切换到
    //根目录，否则不变；如果第二个为0,那么stdin, stdout, stderr将被重定向到
    // /dev/null
    daemon(1, 1);

    sleep(60);
    return 0;
}
